package main

import (
	"fmt"
	"math/rand"
	"os"
)

type ArrayQueue struct {
	maxSize int
	arr     [4]int
	front   int
	rear    int
}

// 判断队列是否已满
func (this *ArrayQueue) isFull() bool {
	return this.rear == this.maxSize-1
}

// 判断队列是否为空
func (this *ArrayQueue) isEmpty() bool {
	return this.rear == this.front
}

// 添加数据到队列
func (this *ArrayQueue) addQueue(n int) {
	if this.isFull() {
		fmt.Println("队列已满")
	} else {
		this.rear++ // 让 rear 后移一位
		this.arr[this.rear] = n
	}
}

// 取出队列
func (this *ArrayQueue) getQueue() int {
	if this.isEmpty() {
		fmt.Println("队列为空不能取数据")
		return -1
	} else {
		this.front++
		return this.arr[this.front]
	}
}

// 显示队列的所有数据
func (this *ArrayQueue) showQueue() {
	// 为空
	if this.isEmpty() {
		fmt.Println("队列为空")
	} else {
		// 找到对首，遍历到队尾
		for i := this.front + 1; i <= this.rear; i++ {
			fmt.Println(i,"=",this.arr[i])
		}
	}
}

func (this *ArrayQueue) headQueue() int {
	// 为空
	if this.isEmpty() {
		fmt.Println("队列为空")
		return -1
	} else {
		return this.arr[this.front+1]
	}
}

func main() {
	arrayQueue := &ArrayQueue{
		maxSize: 4,
		front:   -1,
		rear:    -1,
	}
	fmt.Println(arrayQueue)
	// fmt.Println(arrayQueue.isFull())

	for {
		fmt.Println("请输入你的操作")
		fmt.Println("s(show):显示队列")
		fmt.Println("e(exit):退出程序")
		fmt.Println("a(add):添加数据到队列")
		fmt.Println("g(get):从队列里取出数据")
		fmt.Println("h(head):查看队列头数据")

		// 接收用户的选择
		var key string
		// 接收控制台输入
		fmt.Scanf("%s\n", &key)

		if key == "s" {
			arrayQueue.showQueue()
		} else if key == "e" {
			fmt.Println("退出")
			os.Exit(0)
		} else if key == "a" {
			arrayQueue.addQueue(rand.Int())
		} else if key == "g" {
			fmt.Println(arrayQueue.getQueue())
		} else if key == "h" {
			fmt.Println(arrayQueue.headQueue())
		}
	}
}
